﻿#define _CRT_SECURE_NO_WARNINGS 

#include<stdio.h>
//一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
//
//编写一个函数找出这两个只出现一次的数字。
//
//
//
//例如：
//
//有数组的元素是：1，2，3，4，5，1，2，3，4，6
//
//只有5和6只出现1次，要找出5和6.

//void findnum(int arr[], int n, int* pnum1, int* pnum2)
//{
//	int ret = 0;
//	//1.先把每个元素进行按位异或
//	for (int i = 0; i < n; i++)
//	{
//		ret ^= arr[i];
//	}
//	//2.将他们进行单身狗区分异或的结果 进行0与1的区分
//	int pos = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((ret>> i) & 1 == 1)
//		{
//			pos = arr[i];
//			break;
//		}
//	}
//	//3.将他们分为pnum1的0为类型，pnum2的1为一类型
//	for (int i = 0; i < n; i++)
//	{
//		if ((arr[i] >> pos & 1 )== 1)
//		{
//			*pnum1 ^= arr[i];
//		}
//		else
//		{
//			*pnum2 ^= arr[i];
//		}
//	}
//}


//void findnum(int arr[], int n, int *pnum1, int *pnum2)
//{
//	//1.每个元素都按位异或
//	int ret = 0;
//	for (int i = 0; i < n; i++)
//	{
//		ret ^= arr[i];
//	}
//	//2.将他们进行区分异或的结果，进行0与1的区分
//	//确认ret 哪一位是ret 二进制是 1 一个数字有32位
//	int pos = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((ret >> i & 1)==1)
//		{
//			pos = arr[i];
//			break;
//		}
//	}
//	//3. pos为0放为一组 ，pos为1放为一组
//	for (int i = 0; i < n; i++)
//	{
//		if ((arr[i] >> pos & 1) == 1)
//		{
//			*pnum1 ^= arr[i];
//		}
//		else 
//		{
//			*pnum2 ^= arr[i];
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	int num1 = 0;
//	int num2 = 0;
//	findnum(arr, len, &num1, &num2);
//	printf("%d %d\n",num1,num2);
//	return 0;
//}


//int main() {
//    int year, month;
//    int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//    while (scanf("%d %d", &year, &month) != EOF) { // 注意 while 处理多个 case
//        int day = days[month - 1];   //days[1] = 2
//        // 64 位输出请用 printf("%lld") to 
//        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
//        {
//            if (month == 2)
//            {
//                day += 1;
//            }
//        }
//        printf("%d\n", day);
//    }
//    return 0;
//}


//转移表
//实现计算机基本功能
int add(int x, int y)
{
	return x + y;
}

int sub(int x, int y)
{
	return x - y;
}

int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("*****************\n");
	printf("**1.add   2.sub**\n");
	printf("**3.mul   4.div**\n");
	printf("*** 0.exit    ***\n");
	
 }
//int main()
//{
//	int x,y = 0;
//	int input = 0;
//	int ret = 0;
//	menu();
//	printf("请选择:\n");
//	scanf("%d", &input);
//	switch (input)
//	{
//	case 1:
//		printf("输入操作数:\n");
//		scanf("%d %d", &x, &y);
//		ret = add(x,y);
//		printf("ret = %d\n", ret);
//		break;
//	case 2:
//		printf("输入操作数:\n");
//		scanf("%d %d", &x, &y);
//		ret = sub(x, y);
//		printf("ret = %d\n", ret);
//		break;
//	case 3:
//		printf("输入操作数:\n");
//		scanf("%d %d", &x, &y);
//		ret = mul(x, y);
//		printf("ret = %d\n", ret);
//		break;
//	case 4:
//		printf("输入操作数:\n");
//		scanf("%d %d", &x, &y);
//		ret = div(x, y);
//		printf("ret = %d\n", ret);
//		break;
//	case 0:
//		printf("退出游戏\n");
//		break;
//	default:
//		printf("输入有误，请重新输入\n");
//		break;
//	}
//	
//	return 0;
//}

int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int (*p[5])(int x, int y) = {NULL,add,sub,mul,div };
	do {
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		if (input <= 4 && input >= 1)
		{
			printf("输入操作数:\n");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
		   printf("ret = %d\n", ret);
		   printf("\n");
		}
		else if (input == 0)
		{
			printf("退出计算\n");
		}else
		{
			printf("输入有误，请重新输入\n");
		}
	} while (input);
	return 0;
}